function merge(left, right) {
  const temp = [];
  while (left.length && right.length) {
    if (left[0] < right[0]) {
      temp.push(left.shift());
    } else {
      temp.push(right.shift());
    }
  }
  //left和right长度不一样时，直接连接剩下的长的部分（本身有序）
  return temp.concat(left, right);
}
function mergeSort(data) {
  if (data.length <= 1) {
    return data;
  }
  const mid = Math.floor(data.length / 2);
  const left = data.slice(0, mid);
  const right = data.slice(mid);
  return merge(mergeSort(left), mergeSort(right));
}
const arr = [2, 1, 10, 8, 5, 4, 7.01, 3.3, 3, 9, 6, 0, -1, -2, 2 * 1, 3 * -1, 1 - 5, 2.13, 2.12]
console.log(mergeSort(arr));

// ** 归并排序
// 利用归并的思想实现的排序方法，该算法采用经典的分治（divide - and - conquer）策略
// （分治法将问题分(divide)成一些小的问题然后递归求解，
//  而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起，即分而治之) 。